"""
@name : 测试
@author : yinbangyou
@projectname: tianlongbabu
"""
####用户验证
def login():
    print("\n*** welcome to sctl shopping mall ***")
    print(" 购物过程如需退出请输入exit，祝您购物愉快^_^\n")
    i = 0
    while i <3:
        usrname = input("请输入用户名：")
        password = input("请输入密码：")
        if usrname == 'root' and password == '123456':
            print ("登陆成功")
            break
        else:
            print(f"登陆失败，您还剩{2-i}次机会")
            i += 1
    else:
        print("三次机会已用完")

####shopping mall商品清单输出
def shopping_item():
    global items
    print("\n*****商品信息*****")
    for code, info in items.items():
        print(" 商品编号：{}".format(code))
        # 字典嵌套使用双循环,第一个循环中要一个代表内嵌字典的变量
        for name, price in info.items():
            print(" {}: {}".format(name, price))

####预算金额函数
def budget_money():
    global budget
    budget = input("请输入你的购物预算：")
    if budget.isdigit():
        #判读用户输入是否为数字，不是就要求用户重新输入
        budget_have = budget
        print("\n让我们开始愉快的shopping吧")
        print("温馨提示：买买买的同时也要注意预算哦^_^")
    else:
        print("您的输入不正确，请重新输入")
        budget_money()
    return budget

####购买首页
def shopping_mall(items):
    while True:
        print("\n查看商店商品信息请输入：item")
        print("查看已购买信息请输入:view")
        print("退出请输入:exit")
        shopping_lst = input("继续购买请输入商品编号")
        if shopping_lst == 'exit':
            shopping_view()
            exit()
            #打印购物清单和余额并退出
        elif shopping_lst == 'view':
            shopping_view()
            #查看已购买的信息
        elif shopping_lst == 'item':
            shopping_item()
        else:
            shopping(shopping_lst)

####购物进行
def shopping(shopping_lst):
    global items,item_count,item_price
    while True:
         if shopping_lst in items:
             item_count = input("请输入你要购买的数量：")
             if item_count == 'exit':
                 shopping_view()
                 exit(0)
             elif item_count.isdigit():
                 pay(shopping_lst)
                 shopping_mall(items)
             else:
                print("\n您的输入有误，请重新输入")
                shopping(shopping_lst)
         else :
            print("\n抱歉，没有找到您所输入的编号，请重新输入\n")
            shopping_mall(items)

####清单打印
def shopping_view():
    global budget_have,bought
    print("\n")
    print("******* 购 物 清 单 ********")
    print("商品名称 商品价格 购买数量 价格")
    for bought_name,info in bought.items():
        bought_price = bought[bought_name].get('price')
        bought_count = bought[bought_name].get('count')
        print("{: ^5}{: ^7.2}{: ^7}{: ^7.2}".format(bought_name,bought_price,bought_count,float(bought_count)*bought_price))
    print("     余额 ：{}".format(budget_have))

####检测余额和扣款
def pay(shopping_lst):
    global item_price,item_name,item_count,budget,budget_have,bought,count,items
    item_price = items[shopping_lst].get('商品价格')
    item_name = items[shopping_lst].get('商品名称')
    if  Decimal(float(budget_have) - float(item_count) * item_price).quantize(Decimal('0.00'))< 0:
        print("\n购买超出预算了哦，再考虑一下吧")
    else:
        budget_have = Decimal(float(budget_have) - float(item_count) * item_price).quantize(Decimal('0.00'))
        print("\n您成功购买了{}个{}，总价{},余额{}".format(item_count, item_name, Decimal(float(item_count) * item_price).quantize(Decimal('0.00')), budget_have))
        #使用decimal函数让总价只保留两位小数，四舍五入
        if count == 0:
            bought = {item_name:{'price':item_price,'count':item_count}}
                     #保存购买物品的编号和数量即可，在pay中可以根据编号在items中找到相应商品名称和价格输出
            count+=1
                     #count用来给字典第一次赋值进行判断，该if段只运行一遍
            shopping_mall(items)
        elif item_name in bought:
            old_count = change_key(bought,item_name)
            #change_key返回一个旧的购买数量
            bought[item_name] = {'price': item_price, 'count': int(item_count)+int(old_count)}
            #如果相同物品多次购买，新旧数量 合并
        else:
            bought[item_name] = {'price':item_price,'count':item_count}
                     # 保存购买物品的编号和数量即可，在pay中可以根据编号在items中找到相应商品名称和价格输出
            shopping_mall(items)

####合并多次购买的同一物品
def change_key(bought,key):
    for key_search,info in bought.items():
        if isinstance(info,dict):
            change_key(info,key)
        if key_search == key:
            value = bought[key_search].get('count')
            return value
        #返回旧的购买数量，在pay中用旧的和相加

####主页函数调用
from decimal import *
items = {'F00001':{'商品名称':'苹果','商品价格':1.2},'F00002':{'商品名称':'香蕉','商品价格':1.5},'F00003':{'商品名称':'人参果','商品价格':120}}
bought = {}
item_name = ''
item_price,item_count,count,budget = 0,0,0,0
login()
budget_have=budget_money()
shopping_item()
shopping_mall(items)